package com.example.gateway.designPattern.decorator;

import com.example.gateway.designPattern.decorator.Decaf;
import com.example.gateway.designPattern.decorator.Drink;
import com.example.gateway.designPattern.decorator.Milk;

/**
 * @ClassName: Client
 * @Description:
 * @Author: YourName
 * @Date: 2024/12/31
 */

public class Client {

    public static void main(String[] args) {
        /*
        *装饰者模式：
        *   装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。
        *   在这里应用继承并不是实现方法的复制,而是实现类型的匹配。
        *   因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。
        *   根据装饰者模式的理念,我们可以在任何时候,
        *   实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要修改原程序了。
        *
        *  优点
        *      1. 装饰类和被装饰类可以独立发展，不会相互耦合，装饰模式是继承的一个替代模式，装饰模式可以动态扩展一个实现类的功能。
        *      2. 装饰器是继承的有力补充，比继承灵活，可以在运行时选择不同的装饰器，从而实现不同的行为。
        *
        *  缺点：
        *      1. 多层装饰比较复杂。
        *      2. 装饰模式会增加许多子类，过度使用会增加程序复杂性。
        *
        * 个人理解： 就是可以通过添加新的对象 对原有的 对象进行扩展（功能的增强），而不用修改原有的代码
        */


        Drink order;
        order = new Decaf();
        System.out.println("order1 price:" + order.cost());
        System.out.println("order1 desc:" + order.getDescription());
        System.out.println("****************");
        order = new Milk(order);
        System.out.println("order2 price:" + order.cost());
        System.out.println("order2 desc:" + order.getDescription());
    }
}
